package com.hs.common.api.calculation;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.hs.common.api.dto.FeeDto;
import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;

/**
 * @author lhj
 * @date 2022 - 07 - 25
 * @desc
 */
@Slf4j
public class Money {

    public static FeeDto getFee(DateTime start, DateTime end) {
//        start = DateUtil.parse("2022-07-22 22:30:00");
//        end = DateUtil.parse("2022-07-24 2:30:00");
        log.info("驶入时间 = {}，驶离时间 = {}", start, end);
        System.out.println("驶入时间 = " + start + "，驶离时间 = " + end);
        long totalMinute = DateUtil.between(start, end, DateUnit.MINUTE); //停车总分钟数
        log.info("停车总分钟为 = {}分钟", totalMinute);
        System.out.println("停车总分钟为 = " + totalMinute);
        long day = DateUtil.between(start, end, DateUnit.DAY); //停车总天数
        long minute = totalMinute - (day * 1440);
        log.info("停车时间为 = {}天，{}分钟", day, minute);
        System.out.println("停车时间为 = " + day + "天，" + minute + "分钟");

        int startHour = start.hour(true);
        int startMinute = start.minute();
        int endHour = end.hour(true);
        int endMinute = end.minute();
        log.info("{}点{}分驶入泊位，{}点{}分驶离泊位", startHour, startMinute, endHour, endMinute);
        long fee = 0;
        int buzyHours = 0;
        int NonBuzyHours = 0;
        long fee1 = 0;// 繁忙时段费用
        long fee2 = 0;// 非繁忙时段费用
        //---每天停车费用：60元---

        //1. 驶入时间和驶离时间都在非繁忙时段 2元 / 60分钟
        if ((startHour < 9 || startHour > 21) && (endHour < 9 || endHour > 21)) {
            //1、 如果一天内 停车时间超过5小时(300分钟)，按最高限价 10元 收费
            if (minute > 300) {
                fee = 10 + (day * 60);
            }
            //2、 超过30分钟不足60分钟，按60分钟计算
            if (minute % 60 > 30) {
                fee = (((minute - 30) / 60) + 1) * 2;
            }
            //3、 没有超过30分钟，不额外计费
            if (minute % 60 <= 30) {
                fee = ((minute - 30) / 60) * 2;
            }
        }

        //2. 驶入时间和驶离时间都在繁忙时段
        if ((startHour >= 9 && startHour <= 21) && (endHour >= 9 && endHour <= 21)) {
            //1、 如果一天内 停车时间超过5小时(300分钟)，按最高限价 50元 收费
            if (minute > 300) {
                fee = 50 + (day * 60);
            }
            //2、 超过15分钟不足30分钟，按30分钟计算
            if (minute % 30 > 15) {
                fee = (((minute - 30) / 30) + 1) * 5;
            }
            //3、 没有超过30分钟，不额外计费
            if (minute % 30 <= 15) {
                fee = ((minute - 30) / 30) * 5;
            }
        }
        //3. 驶入时间在繁忙时段，驶出时间在非繁忙时段
        if ((startHour >= 9 && startHour <= 21) && (endHour < 9 || endHour > 21)) {
            //1、判断繁忙和非繁忙时段具体停车时间？
            //1.1、繁忙时段停分钟数
            buzyHours = getBuzyHour(startHour) * 60 + (60 - startMinute);
            //1.2、非繁忙时段停分钟数
            //1.2.1、    9：00之前
            if (endHour < 9) {
                NonBuzyHours = (9 - endHour) * 60 + (60 - endMinute);
            }
            //1.2.2、    21：00之后
            if (endHour > 21) {
                NonBuzyHours = (endHour - 21) * 60 + (60 - endMinute);
            }
            //2、计算停车费用
            //2.1、繁忙时段
            //2.1.1、时段停车时间超过5小时(300分钟)，按最高限价 50元 收费
            if (buzyHours > 300) {
                fee1 = 50;
            }
            if (buzyHours <= 300) {
                //2.1.2、繁忙时段-超过15分钟不足30分钟，按30分钟计算
                if ((buzyHours % 30 > 15)) {
                    fee1 = (((buzyHours - 30) / 30) + 1) * 5;
                }
                //2.1.3、繁忙时段-没有超过15分钟，不额外计费
                if (buzyHours % 30 <= 15) {
                    fee1 = ((buzyHours - 30) / 30) * 5;
                }
            }
            //2.2、非繁忙时段
            //2.2.1、时段停车时间超过5小时(300分钟)，按最高限价 50元 收费
            if (NonBuzyHours > 300) {
                fee2 = 50;
            }
            if (NonBuzyHours <= 300) {
                //2.2.2、非繁忙时段-超过30分钟不足60分钟，按60分钟计算
                if ((NonBuzyHours % 60 > 30)) {
                    fee2 = (((NonBuzyHours - 30) / 60) + 1) * 2;
                }
                //2.2.3、非繁忙时段-没有超过30分钟，不额外计费
                if (NonBuzyHours % 60 <= 30) {
                    fee2 = ((NonBuzyHours - 30) / 60) * 2;
                }
            }
        }

        //4. 驶入时间在非繁忙时段，驶出时间在繁忙时段
        if ((startHour < 9 || startHour > 21) && (endHour >= 9 && endHour <= 21)) {
            //1、判断繁忙和非繁忙时段具体停车时间？
            //1.1、繁忙时段停分钟数
            buzyHours = getBuzyHour(endHour) * 60 + endMinute;
            //1.2、非繁忙时段停分钟数
            //1.2.1、    9：00之前
            if (startHour < 9) {

                NonBuzyHours = (8 - startHour >= 1 ? 8 - startHour : 0) * 60 + (60 - startMinute);
            }
            //1.2.2、    21：00之后
            if (startHour > 21) {
                NonBuzyHours = (startHour - 21) * 60 + (60 - startMinute);
            }
            //2、计算停车费用
            //2.1、繁忙时段
            //2.1.1、时段停车时间超过5小时(300分钟)，按最高限价 50元 收费
            if (buzyHours >= 300) {
                fee1 = 50;
            }
            if (buzyHours < 300) {
                //2.1.2、繁忙时段-超过15分钟不足30分钟，按30分钟计算
                if ((buzyHours % 30 > 15)) {
                    fee1 = (((buzyHours - 30) / 30) + 1) * 5;
                }
                //2.1.3、繁忙时段-没有超过15分钟，不额外计费
                if (buzyHours % 30 <= 15) {
                    fee1 = ((buzyHours - 30) / 30) * 5;
                }
            }
            //2.2、非繁忙时段
            //2.2.1、时段停车时间超过5小时(300分钟)，按最高限价 50元 收费
            if (NonBuzyHours > 300) {
                fee2 = 50;
            }
            if (NonBuzyHours <= 300) {
                //2.2.2、非繁忙时段-超过30分钟不足60分钟，按60分钟计算
                if ((NonBuzyHours % 60 > 30)) {
                    fee2 = (((NonBuzyHours - 30) / 60) + 1) * 2;
                }
                //2.2.3、非繁忙时段-没有超过30分钟，不额外计费
                if (NonBuzyHours % 60 <= 30) {
                    fee2 = ((NonBuzyHours - 30) / 60) * 2;
                }
            }
        }
            fee = fee1 + fee2 + fee + (day * 60);
        if (buzyHours != 0 && NonBuzyHours != 0) {

            System.out.println("繁忙时段停车时长：" + buzyHours + "分钟,非繁忙时段停车时长：" + NonBuzyHours + "分钟");
        }
        return FeeDto.builder().totalMinute(totalMinute).fee(new BigDecimal(fee)).build();
    }

    /**
     * 判断繁忙时段停车时长
     *
     * @param a 当前小时
     * @return 停车时长(h)
     */
    private static int getBuzyHour(int a) {
        int i = a - 12 > 0 ? a - 12 : a;
        return i - 9 > 0 ? i - 9 : 9 - i;
    }

    public static void main(String[] args) {
//        start = DateUtil.parse("2022-07-22 22:30:00");
//        end = DateUtil.parse("2022-07-24 2:30:00");
        FeeDto fee = getFee(DateUtil.parse("2022-07-22 6:20:00"),
                DateUtil.parse("2022-07-23 8:40:00"));
        System.out.println("fee = " + fee);
    }


}
